package com.xiaoze.springcloud.config;

import com.xiaoze.springcloud.entity.UserInfo;
import com.xiaoze.springcloud.entity.UserInfoContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 请求头过滤器
 *
 * 拦截器与过滤器的区别:
 * 过滤器和拦截器非常相似，但是它们有很大的区别
 * 最简单明了的区别就是过滤器可以修改request，而拦截器不能
 * 过滤器需要在servlet容器中实现，拦截器可以适用于javaEE，javaSE等各种环境
 * 拦截器可以调用IOC容器中的各种依赖，而过滤器不能
 * 过滤器只能在请求的前后使用，而拦截器可以详细到每个方法
 * 区别很多，大家可以去查下
 * 总的来说
 * 过滤器就是筛选出你要的东西，比如requeset中你要的那部分
 * 拦截器在做安全方面用的比较多，比如终止一些流程
 *
 * @author xiaoze
 * @date 2020/5/23
 */
@Slf4j
public class TransmitHeaderFilter implements Filter {

    /**
     * 可以初始化Filter配置的初始化参数
     * filter对象只会创建一次，init方法也只会执行一次。
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        try{
            this.initUserInfo((HttpServletRequest)request);
            chain.doFilter(request,response);
        }finally{
            //在这里增加删除ThreadLocal中存储的用户信息
            UserInfoContext.remove();
        }
    }

    /**
     * //当Filter被移除或服务器正常关闭时
     */
    @Override
    public void destroy() {
    }


    /**
     * 初始化用户信息
     * @param request 请求信息
     */
    private void initUserInfo(HttpServletRequest request){

        UserInfo userInfo = new UserInfo();

        String authorization = request.getHeader("Authorization");

        if (StringUtils.isNotBlank(authorization)) {
            String[] strArray = authorization.split(":");
            userInfo = new UserInfo(strArray[0], strArray[1]);
        }

        //将UserInfo放入上下文中
        UserInfoContext.setUser(userInfo);

    }
}
